//丢失的数字
/*给定一个包含 [0, n] 中 n 个数的数组 nums ，找出 [0, n] 这个范围内没有出现在数组中的那个数。
*/
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int sum = 0;
        for (auto& num : nums) {
            sum += num;
        }
        return n * (n + 1) / 2 - sum;
    }
};
//消失的两个数字
/*给定一个数组，包含从 1 到 N 所有的整数，但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗？

以任意顺序返回这两个数字均可。*/
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int x_xor_y = 0;
        int n = nums.size();
        int x = 0, y = 0;
        for (int i = 1; i <= n + 2; i++) {
            x_xor_y ^= i;
        }
        for (int i = 0; i < n; i++) {
            // x_xor_y ^= i;
            x_xor_y ^= nums[i];
        }
        // x_xor_y ^= n;
        // x_xor_y ^= (n + 1);
        // x_xor_y ^= (n + 2);
        for (int i = 0; i < n; i++) {
            if (nums[i] & (x_xor_y & (-x_xor_y)))
                x ^= nums[i];
            else
                y ^= nums[i];
        }
        for (int i = 1; i <= n + 2; i++) {
            if (i & (x_xor_y & (-x_xor_y)))
                x ^= i;
            else
                y ^= i;
        }
        return {x, y};
    }
};


//替换所有的问号
/*给你一个仅包含小写英文字母和 '?' 字符的字符串 s，请你将所有的 '?' 转换为若干小写字母，使最终的字符串不包含任何 连续重复 的字符。

注意：你 不能 修改非 '?' 字符。

题目测试用例保证 除 '?' 字符 之外，不存在连续重复的字符。

在完成所有转换（可能无需转换）后返回最终的字符串。如果有多个解决方案，请返回其中任何一个。可以证明，在给定的约束条件下，答案总是存在的。

 */
 class Solution {
public:
    string modifyString(string s) {
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '?') {
                for (int ch = 'a'; ch <= 'z'; ch++) {
                    if ((i == 0 || ch != s[i - 1]) &&
                        (i == s.size() - 1 || ch != s[i + 1])) {
                        s[i] = ch;
                        break;
                    }
                }
            }
        }
        return s;
    }
};